package work.base.jvm.class_eg.classloader;


import java.io.File;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;

/**
 * @author Sakura Shen
 *
 * 使用URLClassLoader类动态加载外部class文件
 * 不需要重启服务器就能动态的使用新加的外部class文件 并且使用其中的方法
 * E:\\里面要存在的是Hello.java编译成的class文件才能动态加载
 *
 * Hello.java文件在同级目录下
 */
public class ClassLoaderTest {

    public static void main(String[] args) throws MalformedURLException, ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
        File file = new File("E:\\");
        URL url = file.toURI().toURL();
        URL[] urls = new URL[]{url};
        URLClassLoader loader=new URLClassLoader(urls);

        // 1 得到外部加载的class对象
        Class<?> clazz = loader.loadClass("Hello");
        System.out.println("当前类加载器"+clazz.getClassLoader());
        System.out.println("父类加载器"+clazz.getClassLoader().getParent());


        // 2 利用反射调用方法
        Object obj = clazz.newInstance();
        // 无参无返回值的方法
        Method m1 = clazz.getDeclaredMethod("getInfo1");
        Object res1 = m1.invoke(obj);
        // 有参数有返回值的方法
        Method m2 = clazz.getDeclaredMethod("getInfo2",String.class);
        Object res2 = m2.invoke(obj,"实际的参数值");

        System.out.println("END");
    }
}



